home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------------------------
- *
- * Simple Sample PowerTalk Application Framework
- *
- * ©1991-1993 Apple Computer
- *
- -------------------------------------------------------------------------------------*/
- /*
- * draw.mailer.window.c -- mailer window class
- *
- * change history:
- *
- * SJF 08/23/93 1.0f1 update to final headers, fix comments
- * SJF 04/21/93 1.0b2 update to b2
- * SJF 03/01/93 1.0b1 added digital signatures
- * SJF 02/09/93 1.0b1 update to b1
- * SJF 10/13/92 1.0d4 update to a11
- * SJF 09/09/92 1.0d3 update to a9
- * SJF 05/07/92 1.0d2 update to a6
- * SJF 11/06/91 1.0d1 initial coding
- *
- */
-
- #ifndef __TYPES__
- #include <Types.h>
- #endif
-
- #ifndef __QUICKDRAW__
- #include <QuickDraw.h>
- #endif
-
- #ifndef __WINDOWS__
- #include <Windows.h>
- #endif
-
- #ifndef __MENUS__
- #include <Menus.h>
- #endif
-
- #ifndef __OCESTANDARDMAIL__
- #include <OCEStandardMail.h>
- #endif
-
- #ifndef __OCEERRORS__
- #include <OCEErrors.h>
- #endif
-
- #include "const.h"
- #include "strconst.h"
- #include "mytypes.h"
- #include "globals.h"
- #include "utils.h"
- #include "windowstuff.h"
- #include "mymenus.h"
- #include "mystandardmail.h"
- #include "windutils.h"
-
- #include "base.window.h"
- #include "draw.window.h"
- #include "draw.mailer.window.h"
-
- /* instantiate a new draw mailer window */
-
- WindowPtr DMailerMakeWindow(Rect *wRect,StringPtr title,Boolean visible,short wdefProc,
- Boolean goAwayFlag)
- {
- WInfoPtr infoPtr;
- WindowPtr theWindow;
- char hState;
- Point topLeft = {0,0};
- short mWidth,contHeight,expHeight;
- OSErr err;
-
- theWindow = BaseMakeWindow(wRect,title,visible,wdefProc,goAwayFlag);
- SetWindowKind(theWindow,kDrawMailerWindow);
-
- infoPtr = BeginWindowAccess(theWindow,&hState);
-
- SetDMailerMethods(infoPtr);
-
- infoPtr->otherData[kLetterDescData] = nil;
- infoPtr->otherData[kLastChangedData] = 0;
- infoPtr->otherFlags[kMailerExpanded] = gPreferences.expandOnOpen;
- infoPtr->data = nil;
- infoPtr->otherData[kDSIGData] = nil;
-
- // adjust window inset area
-
- err = SMPGetDimensions(&mWidth,&contHeight,&expHeight);
- if (err!=noErr)
- DoError(err);
- if (infoPtr->otherFlags[kMailerExpanded])
- infoPtr->topIndent += expHeight;
- else
- infoPtr->topIndent += contHeight;
-
- // make scroll bars
-
- MakeScrollBars(theWindow,infoPtr);
-
- EndWindowAccess(theWindow,hState);
- return theWindow;
- }
-
-
- /* set up the method pointers for the drawing mailer window class (may be called when a mailer
- gets added/removed
- */
- void SetDMailerMethods(WInfoPtr infoPtr)
- {
- infoPtr->m_idle = BaseIdleWindow;
- infoPtr->m_fixCursor = DMailerFixCursorWindow;
- infoPtr->m_activate = DMailerActivateWindow;
- infoPtr->m_deactivate = DMailerDeactivateWindow;
- infoPtr->m_update = DMailerUpdateWindow;
- infoPtr->m_key = BaseKeyWindow;
- infoPtr->m_resize = DrawResizeWindow;
- infoPtr->m_click = DMailerClickWindow;
- infoPtr->m_destroy = DMailerDestroyWindow;
- infoPtr->m_undo = DMailerUndoWindow;
- infoPtr->m_cut = DMailerCutWindow;
- infoPtr->m_copy = DMailerCopyWindow;
- infoPtr->m_paste = DMailerPasteWindow;
- infoPtr->m_clear = DMailerClearWindow;
- infoPtr->m_print = DMailerPrintWindow;
- infoPtr->m_pageSetup = DMailerPageSetupWindow;
- infoPtr->m_save = DMailerSaveWindow;
- infoPtr->m_load = DMailerLoadWindow;
- infoPtr->m_event = DMailerEventWindow;
- infoPtr->m_ctrlHit = DrawHitControlWindow;
- infoPtr->m_selectAll = DMailerSelectAllWindow;
- infoPtr->m_group = DrawGroupWindow;
- infoPtr->m_unGroup = DrawUnGroupWindow;
- }
-
-
- /* handle mouse-moved events for draw-mailer window */
-
- void *DMailerFixCursorWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- RgnHandle returnRgn;
- unsigned long *crsrData;
- RgnHandle arrowRgn,pencilRgn,mailerRgn;
- Point offsetPt,mousePt;
- GrafPtr savePort;
- Rect drawRect;
-
- GetPort(&savePort);
- SetPort(window);
-
- crsrData = (unsigned long *)data;
- returnRgn = (RgnHandle)crsrData[1];
- mousePt = *(Point *)&crsrData[0];
- arrowRgn = NewRgn();
- pencilRgn = NewRgn();
- mailerRgn = NewRgn();
-
- drawRect = window->portRect;
- drawRect.bottom -= 15;
- drawRect.right -= 15;
-
- SetRectRgn(arrowRgn,-32768,-32768,32767,32767);
- RectRgn(pencilRgn,&drawRect);
- SetPt(&offsetPt,0,0);
- LocalToGlobal(&offsetPt);
- OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
- DiffRgn(arrowRgn,pencilRgn,arrowRgn);
-
- drawRect.top += infoPtr->topIndent;
- RectRgn(pencilRgn,&drawRect);
- OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
- drawRect.top -= infoPtr->topIndent;
- drawRect.bottom = drawRect.top + infoPtr->topIndent;
- RectRgn(mailerRgn,&drawRect);
- OffsetRgn(mailerRgn,offsetPt.h,offsetPt.v);
-
- if (PtInRgn(mousePt,arrowRgn)) {
- CopyRgn(arrowRgn,returnRgn);
- SetCursor(&qd.arrow);
- }
- else if (PtInRgn(mousePt,pencilRgn)) {
- CopyRgn(pencilRgn,returnRgn);
- if (gCurrentShape!=kSelectShape)
- SetCursor(&gPencilCursor);
- else
- SetCursor(&qd.arrow);
- }
- else if (PtInRgn(mousePt,mailerRgn)) {
- CopyRgn(mailerRgn,returnRgn);
- }
-
-
- DisposeRgn(arrowRgn);
- DisposeRgn(pencilRgn);
- DisposeRgn(mailerRgn);
- SetPort(savePort);
-
- return BaseFixCursorWindow(window,infoPtr,data);
- }
-
-
- /* handle mouse click in content for draw-mailer window */
-
- void *DMailerClickWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- RgnHandle savedClip;
- GrafPtr savePort;
- void *returnVal;
- OSErr err;
- Boolean alreadyChanged;
-
- // make sure we can change the letter
-
- alreadyChanged = infoPtr->changed;
- if (!alreadyChanged && (gCurrentShape!=kSelectShape)) {
- err = SMPPrepareToChange(window);
- if (err==userCanceledErr)
- return nil;
- }
-
- // since we're drawing a shape, clear any mailer undo buffer
- err = SMPClearUndo(window);
- if (err!=noErr)
- DoError(err);
-
- // remove mailer from clip
- GetPort(&savePort);
- SetPort(window);
- savedClip = NewRgn();
- GetClip(savedClip);
- ClipToDrawing(window,infoPtr);
-
- // call drawing click method and maybe mark letter changed
- returnVal = DrawClickWindow(window,infoPtr,data);
- if (!alreadyChanged && infoPtr->changed) {
- err = SMPContentChanged(window);
- if (err!=noErr)
- DoError(err);
- }
-
- // restore clip
- SetClip(savedClip);
- DisposeRgn(savedClip);
- SetPort(savePort);
- return returnVal;
- }
-
-
- /* deallocate any memory associated with the draw-mailer window class */
-
- void *DMailerDestroyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
- SMPCloseOptions *closeOptions,noCloseOptions;
-
- if (infoPtr->otherData[kLetterDescData])
- DisposHandleChk((Handle)infoPtr->otherData[kLetterDescData]);
-
- if (gPreferences.closeOptionsDialog)
- closeOptions = &gPreferences.closeOptions;
- else {
- noCloseOptions.moveToTrash = false;
- noCloseOptions.addTag = false;
- noCloseOptions.tag.dataLength = 0;
- closeOptions = &noCloseOptions;
- }
-
- err = SMPDisposeMailer(window,closeOptions);
- if (err!=noErr)
- DoError(err);
-
- return DrawDestroyWindow(window,infoPtr,data);
- }
-
-
- /* handle activate events for draw-mailer window */
-
- void *DMailerActivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- MenuHandle theMenu;
-
- DisableAllMenus();
-
- theMenu = GetMHandle(kFileMenu);
- EnableAllMenuItems(theMenu);
- if (!infoPtr->changed)
- DisableItem(theMenu, kSaveItem);
-
- theMenu = GetMHandle(kShapesMenu);
- EnableAllMenuItems(theMenu);
- theMenu = GetMHandle(kSignMenu);
- EnableAllMenuItems(theMenu);
-
- FixMailerMenus(window,infoPtr); // fixes up file,edit,mail menu
-
- gMenusDirty = true;
-
- HiliteControl(VSCROLL,0);
- HiliteControl(HSCROLL,0);
- MyDrawGrowIcon(window);
-
- return nil;
- }
-
-
- /* handle deactivate events for draw-mailer window */
-
- void *DMailerDeactivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- MenuHandle theMenu;
- Str255 addMailerText;
-
- HiliteControl(VSCROLL,254);
- HiliteControl(HSCROLL,254);
- MyDrawGrowIcon(window);
-
- theMenu = GetMHandle(kMailMenu);
- GetResString(addMailerText,kAddMailerTextID,kAddMailerText);
- SetItem(theMenu,kAddRemMailItem,addMailerText);
-
- SetDefaultMenus();
- gMenusDirty = true;
- return nil;
- }
-
-
- /* handle update events for draw-mailer window */
-
- void *DMailerUpdateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- RgnHandle savedClip;
-
- savedClip = NewRgn();
- GetClip(savedClip);
- ClipToDrawing(window,infoPtr);
-
- DrawUpdateWindow(window,infoPtr,data);
-
- SetClip(savedClip);
- DisposeRgn(savedClip);
-
- return nil;
- }
-
-
- /* handle generic event for draw-mailer window by passing the event to AOCE */
-
- void *DMailerEventWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- SMPMailerResult whatHappened;
- EventRecord *ev;
- OSErr err;
-
- ev = (EventRecord *)data;
-
- err = SMPMailerEvent(ev,&whatHappened,nil,0L); // call AOCE with the event
- if (err!=noErr) {
- DoError(err);
- }
-
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
-
-
- /* handle undo for draw-mailer window */
-
- void *DMailerUndoWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
- SMPMailerResult whatHappened;
-
- err = SMPMailerEditCommand(window,kSMPUndoCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
-
- if (!ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened)) {
- err = SMPBecomeTarget(window,false,0);
- // ignore errors here- we may already be the target
- DrawUndoWindow(window,infoPtr,data);
- }
-
- return nil;
- }
-
-
- /* handle cut for draw-mailer window */
-
- void *DMailerCutWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- OSErr err;
- SMPMailerResult whatHappened;
-
- err = SMPMailerEditCommand(window,kSMPCutCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
-
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
-
-
- /* handle copy for draw-mailer window */
-
- void *DMailerCopyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- OSErr err;
- SMPMailerResult whatHappened;
-
- err = SMPMailerEditCommand(window,kSMPCopyCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
-
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
-
-
- /* handle paste for draw-mailer window */
-
- void *DMailerPasteWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- OSErr err;
- SMPMailerResult whatHappened;
-
- err = SMPMailerEditCommand(window,kSMPPasteCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
-
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
-
-
- /* handle clear for draw-mailer window */
-
- void *DMailerClearWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- OSErr err;
- SMPMailerResult whatHappened;
-
- err = SMPMailerEditCommand(window,kSMPClearCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
-
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
-
-
- /* handle select all for draw-mailer window */
-
- void *DMailerSelectAllWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
- SMPMailerResult whatHappened;
- SMPMailerState mailerState;
-
- err = SMPGetMailerState(window,&mailerState);
- if (err!=noErr)
- DoError(err);
-
- if (mailerState.isTarget) {
- err = SMPMailerEditCommand(window,kSMPSelectAllCommand,&whatHappened);
- if (err!=noErr)
- DoError(err);
- return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
- }
- else {
- DrawSelectAllWindow(window,infoPtr,data);
- }
- return nil;
- }
-
-
- /* handle print for draw-mailer window */
-
- void *DMailerPrintWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- #pragma unused (data)
- OSErr err;
- short pageCount,curPage;
- Boolean shouldContinue;
- TPPrPort thePrPort;
- TPrStatus theStatus;
- Point zeroOffset = {0,0};
-
- // open print driver
-
- PrOpen();
- if (PrError()!=noErr) {
- DoError(PrError());
- return nil;
- }
-
- // display print dialog
-
- shouldContinue = PrJobDialog(infoPtr->printRecord);
- if (PrError()!=noErr) {
- DoError(PrError());
- return nil;
- }
- if (!shouldContinue)
- return nil;
-
- // init printing grafport
-
- thePrPort = PrOpenDoc(infoPtr->printRecord,nil,nil);
- if (PrError()==noErr) {
- err = SMPPrepareCoverPages(window,&pageCount);
- if (err!=noErr)
- DoError(err);
- for (curPage=1;curPage<=pageCount;curPage++) {
- PrOpenPage(thePrPort,nil);
- if (PrError()==noErr)
- err = SMPDrawNthCoverPage(window,curPage,(curPage==pageCount));
- if (err!=noErr)
- DoError(err);
- PrClosePage(thePrPort);
-
- }
-
- PrOpenPage(thePrPort,nil);
- DrawAllShapes(infoPtr,zeroOffset);
- PrClosePage(thePrPort);
- }
- PrCloseDoc(thePrPort);
-
- if ((((TPPrint)*(infoPtr->printRecord))->prJob.bJDocLoop == bSpoolLoop)&&(PrError() == noErr))
- PrPicFile(infoPtr->printRecord, nil, nil, nil, &theStatus);
-
- // close print driver
-
- PrClose();
-
- return nil;
- }
-
-
- /* handle page setup for draw-mailer window */
-
- void *DMailerPageSetupWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
-
- // make sure we can change the content of the letter
-
- err = SMPPrepareToChange(window);
- if (err!=noErr) {
- DoError(err);
- return nil;
- }
- // we have changed the content of the letter, so notify the mailer
-
- err = SMPContentChanged(window);
- if (err!=noErr) {
- DoError(err);
- return nil;
- }
-
- return DrawPageSetupWindow(window,infoPtr,data);
- }
-
-
- /* handle load for draw-mailer window (grabs main enclosure and calls drawing class load) */
-
- void *DMailerLoadWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
- LetterDescriptor *letterDesc;
- Point upLeft = {0,0};
- FSSpec enclSpec;
- Handle letterDescHndl;
- extern void DoContentStuff(WindowPtr window);
-
- letterDescHndl = NewHandleChk(sizeof(LetterDescriptor));
- if (MemError()!=noErr) {
- DoError(MemError());
- return nil;
- }
-
- letterDesc = (LetterDescriptor *)data;
- BlockMove(letterDesc,*letterDescHndl,sizeof(LetterDescriptor));
- if (infoPtr->otherData[kLetterDescData])
- DoError(kInternalError);
- infoPtr->otherData[kLetterDescData] = letterDescHndl;
-
- err = SMPOpenLetter(letterDesc,window,upLeft,true,gPreferences.expandOnOpen,nil,0L);
- if (err!=noErr) {
- DoError(err);
- return nil;
- }
-
- err = SMPGetMainEnclosureFSSpec(window,&enclSpec);
- if (err!=noErr) {
- DoError(err);
- return nil;
- }
-
- return DrawLoadWindow(window,infoPtr,&enclSpec);
- }
-
-
- /* handle save for draw-mailer window (calls thru to LoSaveLetter) */
-
- void *DMailerSaveWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
- {
- OSErr err;
-
- err = LoSaveLetter(window,infoPtr,(SMPSaveType)data);
- if (err!=noErr) {
- DoError(err);
- return nil;
- }
-
- SetWTitle(window,infoPtr->fileSpec.name);
- return BaseSaveWindow(window,infoPtr,data);
- }
-